import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 *
 * @author su.gd
 * @date 2023-11-13
 */
public class 递归实现文件复制 {

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");
        // todo 如果输出路径下已经有输入路径下的项目，则不再重新创建输入路径下的文件
        String inputPath = projectPath + File.separator + "code-generator-demo-projects/acm-template";
        String outputPath = projectPath;
        copyFileByRecursion(inputPath, outputPath);
    }

    /**
     * 递归拷贝文件（会将输入目录完整的拷贝到输出目录下）
     * @param inputPath
     * @param outputPath
     */
    public static void copyFileByRecursion(String inputPath, String outputPath) {
        File inputFile = new File(inputPath);
        File outputFile = new File(outputPath);
        try {
            copyFileByRecursion(inputFile, outputFile);
        } catch (IOException e) {
            System.err.println("文件复制失败！");
            e.printStackTrace();
        }
    }

    /**
     * 递归实现文件拷贝
     * @param inputFile
     * @param outputFile
     */
    public static void copyFileByRecursion(File inputFile, File outputFile) throws IOException {
        /**
         * 文件A=>目录B,则文件A放在目录B下
         * 文件A=>文件B,则文件A覆盖文件B
         * 目录A=>目录B,则目录A放在目录B下
         *
         * 如何把输入目录复制到指定目录：
         * 1.创建该 输出目录 的 File 对象
         * 2.调用 mkdirs() 方法创建文件
         *
         * 如何把文件复制到指定目录：
         * 1.创建该 输出文件 的 File 对象
         * 2.调用 Files.copy() 方法实现文件复制
         */
        if (inputFile.isDirectory()) {
            // 创建 目标输出目录 的 File 对象
            File destOutputFile = new File(outputFile, inputFile.getName());
            // 如果该文件夹不存在，就需要创建该文件夹
            if (!destOutputFile.exists()) {
                destOutputFile.mkdirs();
            }
            // 获取该目录下的所有文件或子目录
            File[] files = inputFile.listFiles();
            // 无子文件直接结束
            if (ArrayUtil.isEmpty(files)) {
                return;
            }
            for (File file : files) {
                // 递归拷贝下一层文件
                copyFileByRecursion(file, destOutputFile);
            }
        } else {
            /**
             * 获取输出文件路径的两种方式
             */
            // 1. 使用 path 对象的 resolve() 方法将 inputFile 的文件名附加到 outputFile 目录的路径后面
            Path destPath = outputFile.toPath().resolve(inputFile.getName());
            // 2. 使用 文件对象 获取输出文件的路径
            Path destPath2 = new File(outputFile, inputFile.getName()).toPath();

            // 文件复制
            Files.copy(inputFile.toPath(), destPath2, StandardCopyOption.REPLACE_EXISTING);
        }
    }
}
